<?php defined('SYSPATH') or die('No direct script access.');

class Model_ReviewParser_YandexMarket extends Model_ReviewParser_Abstract
{
    protected $market_url = 'http://market.yandex.ru';                          // Урл маркета =)
    protected $search_url = 'http://market.yandex.ru/search.xml?text=';         // Шаблон урла поиска
    protected $reviews_url = 'http://market.yandex.ru/model-opinions.xml';      // Шаблон урла с отзывами
    protected $model = null;                                                    // Экземпляр модели
    
    public function parse(Model_Model $model, $url = null)
    {
        $this->model = $model;
        
        // Получить поисковую строку на основе модели или уже готового урла, полученного тоже из модели
        // Найти нужную модель в маркете
        // Перейти на страницу отзывов
        
        // Цикл: парсим следущую страницу отзывов
        // Парсим все отзывы на этой странице, пытаемся добавить, вся обработка и проверка уникальноти в модели
        
        // TODO повторное использование market_url
        
        $this->reviews_url = $url;
        if (!$this->reviews_url) {
            $this->reviews_url = $this->get_reviews_url($model);        
        }
                
        if (!$this->reviews_url) {
            return null;
        }

        $market_url = $url = $this->reviews_url;        
        if (!$model->market_url) {    
            $model->set_market_url($market_url);
        }
        
        while ($page_data = $this->_get_page_data()) { 
            $next_url = $this->reviews_url;                
            while ($review_data = $this->_get_review_data($page_data)) {
                $id              = $this->_get_id($review_data);
                $user_nick       = $this->_get_user_nick($review_data);
                $user_link       = $this->_get_user_link($review_data);
                $date            = $this->_get_date($review_data);
                $rating          = $this->_get_rating($review_data);
                $experience      = $this->_get_experience($review_data);
                $detailed_rating = $this->_get_detailed_rating($review_data);
                
                $pluses          = $this->_get_pluses($review_data);
                $minuses         = $this->_get_minuses($review_data);
                $text            = $this->_get_text($review_data);
                $u               = $this->_get_usefulness($review_data);
                
                ORM::factory('review_yandexmarket')->add_review($this->model, $id, $text, $pluses, $minuses, $rating, $experience,
                    $user_nick, $user_link, $url, $date, $u['yes'], $u['no']);
				//sleep(1);
                
                /*echo 'id - '.$id.'<br />';
                echo 'user_nick - '.$user_nick.'<br />';
                echo 'user_link - '.$user_link.'<br />'; 
                echo 'date - '.$date.'<br />'; 
                echo 'rating - '.$rating.'<br />'; 
                echo 'experience - '.$experience.'<br />'; 
                echo 'detailed_rating - '.$detailed_rating.'<br />'; 
                echo 'pluses - '.$pluses.'<br />'; 
                echo 'minuses - '.$minuses.'<br />'; 
                echo 'comment - '.$comment.'<br />'; 
                echo 'usefulness - <br />';
                print_r($usefulness); 
                echo '<hr />';   */
            }
            $url = $next_url;
        }    
    }
    
    public function get_reviews_url($entity)
    {
        $name = null;
        if ($entity instanceof Model_Model) {
            $name = $entity->name;    
        } else if ($entity instanceof Model_Product) {
            $name = $entity->clean_name;
        } else if (is_string($entity)) {
            $name = trim($entity);   
        }
        if ($name) {
            $params = $this->_get_model_params($name);
            if (!$params) {
                return null;
            }
            // Удаляем параметры от предыдущего использования   
            return $this->reviews_url = 'http://market.yandex.ru/model-opinions.xml?' . http_build_query($params);
        }
        return null;
    }
    
    public function get_model_name($url)
    {
        $data = $this->_get_source_code($this->reviews_url);
        if ($name = $this->_cut_str('class="b-page-title b-page-title_type_model">', '</h1', $data)) {
            return trim(preg_replace("'<span[^>]*?>.*?</span>'si","",$name));    
        }
        return null;   
    }
    
   /* protected function _get_query_string()
    {
        //return 'Смартфон HTC Desire S';  
        //return 'Часы Casio SGW-100-1V';
        return mb_strtolower($this->model->name);
    }*/
    
    protected function _get_model_params($query)
    {
        if (!$query) {
            return null;
        }
        
        $_data = $this->_get_source_code($this->search_url . urlencode($query));
        if (!($data = $this->_cut_str('class="b-offers b-offers_type_guru b-offers_type_guru_mix"', 'class="b-offers "', $_data))) {
            if ($data = $this->_cut_str('class="b-offers b-offers_type_guru b-offers_type_guru_mix"', '>', $_data)) {
                if ($modelid = $this->_cut_str('id="', '"', $data)) {
                    return array(
                        'modelid' => (int)$modelid,
                    );    
                }    
            }
            return null;    
        }
        
        if (!($modelid = $this->_cut_str('modelid=', '&', $data))) {
            return null;
        }
        
        return array(
            'modelid' => $modelid,
        );
    }
    
    protected function _get_page_data()
    {
        if (!$this->reviews_url) {
            return null;
        }
        
        $data = $this->_get_source_code($this->reviews_url); 
               
        // пихаем в $this->reviews_url адрес следущей страницы
        $this->reviews_url = $this->_get_next_page_url($data);
        
        return $data;
    }
    
    protected function _get_next_page_url($data)
    {
        if ($url = $this->_cut_str('class="b-pager__next" href="', '"', $data)) {
            return $this->market_url . $url;      
        }     
        return null;    
    }
    
    protected function _get_review_data(&$data)
    {
        if ($_data = $this->_cut_str('class="b-grade comment left0"', 'class="line"', $data)) {
            return $_data;    
        }
        return null;
    }
    
    protected function _get_id($data)
    {
        if ($id = $this->_cut_str(' id="', '"', $data)) {
            return (int)$id;    
        }
        return null;
    }
    
    protected function _get_user_nick($data)
    {
        if ($nick = $this->_cut_str('class="b-user__first-letter">', '</a', $data)) {
            return strip_tags($nick);    
        }
        return null;
    }
    
    protected function _get_user_link($data)
    {
        if ($link = $this->_cut_str('class="b-user__link" href="', '"', $data)) {
            return $link;    
        }
        return null;
    }
    
    protected function _get_date($data)
    {
        $months = array(
            'января'    => '01',
            'февраля'   => '02',
            'марта'     => '03',
            'апреля'    => '04',
            'мая'       => '05',
            'июня'      => '06',
            'июля'      => '07',
            'августа'   => '08',
            'сентября'  => '09',
            'октября'   => '10',
            'ноября'    => '11',
            'декабря'   => '12',
        );
        
        if ($date = $this->_cut_str('class="date">', '</div', $data)) {
            $parts = explode(' ', $date);
            $result = array();
            
            if (count($parts) == 2) { // Текущий год
                $result['d'] = $parts[0];
                $result['m'] = $months[$parts[1]];
                $result['y'] = date('Y');
            } else if (count($parts) == 3) {
                $result['d'] = $parts[0];
                $result['m'] = $months[$parts[1]];
                $result['y'] = $parts[2];   
            } else {
                return null;
            }
            
            $date = strtotime(implode('-', $result));
            if ($date) {
                return $date;
            }              
        }
        return null;
    }
    
    protected function _get_rating($data)
    {
        $ratings = array(
            'ужасная модель'    => 1,
            'плохая модель'     => 2,
            'обычная модель'    => 3,
            'хорошая модель'    => 4,
            'отличная модель'   => 5,
        );
        
        if ($rating = $this->_cut_str('class="grade-label">', '</span', $data)) {  
            if (isset($ratings[$rating])) {
                return $ratings[$rating];
            }   
        }
        // ужасная модель отдельно
        if ($rating = $this->_cut_str('class="grade-label verybad">', '</span', $data)) {  
            if (isset($ratings[$rating])) {
                return $ratings[$rating];
            }   
        }
        return 0;   
    }
    
    protected function _get_experience($data)
    {
        if ($experience = $this->_cut_str('Опыт использования:', '</div', $data)) {
            return trim($experience);    
        }
        return null;
    }
    
    protected function _get_detailed_rating($data)
    {
        // TODO
        return null;
    }
    
    protected function _get_pluses($data)
    {
        if ($pluses = $this->_cut_str('Достоинства: </b>', '</p', $data)) {
            return trim($pluses);    
        }
        return null;  
    }
    
    protected function _get_minuses($data)
    {
        if ($minuses = $this->_cut_str('Недостатки: </b>', '</p', $data)) {
            return trim($minuses);    
        }
        return null;  
    }
    
    protected function _get_text($data)
    {
        if ($text = $this->_cut_str('Комментарий: </b>', '</p', $data)) {
            return trim($text);    
        }
        return null;   
    }
    
    
    protected function _get_usefulness($data)
    {
        $usefulness = array();
        if (!($_data = $this->_cut_str('class="b-grade__feedback grade-opinion-actions"', '</tr', $data))) {
            return $usefulness;
        }
        $usefulness['yes'] = 0;
        if (($yes = $this->_cut_str('<span>Да</span></a>', '/', $_data)) !== null) {
            $usefulness['yes'] = (int)$yes;        
        }
        $usefulness['no'] = 0;
        if (($no = $this->_cut_str('<span>Нет</span></a>', '</td', $_data)) !== null) {
            $usefulness['no'] = (int)$no;        
        }
        return $usefulness;
    }
    
    /*protected function encode($str)
    {
        if ($this->charset == 'utf-8') {
            return $str;
        }
        
        return iconv($this->charset, 'utf-8', $str);
    } */
}